﻿//
// Created by Administrator on 2025/9/17.
//

#include <iostream>
#include <chrono>
#include "ModbusTcpClient.h"

int main()
{
    // 创建一个 Modbus TCP 客户端实例
    ModbusTcpClient client;

    // 连接到 Modbus 服务器
    if (!client.connect())
    {
        std::cerr << "无法连接到服务器，程序退出。" << std::endl;
        return -1;
    }

    // 定义寄存器地址和采样间隔
    constexpr int ADDR = 0;
    constexpr std::chrono::milliseconds SAMPLING_INTERVAL(500);

    // --- 任务 1：监控上升沿，并在检测到后写 0 ---
    std::cout << "--- 启动上升沿监控任务 ---" << std::endl;

    // 创建一个 MonitorTask 实例来管理此任务
    MonitorTask risingEdgeTask;

    client.startMonitor(risingEdgeTask,
                        ADDR,
                        SAMPLING_INTERVAL,
                        // 条件函数：判断上升沿（从0到1）
                        [](uint16_t prev, uint16_t current)
                        {
                            return prev == 0 && current == 1;
                        },
                        // 回调函数：执行写0的操作
                        [&](uint16_t prev, uint16_t current)
                        {
                            std::cout << "检测到上升沿！正在向地址 " << ADDR << " 写入 0。" << std::endl;
                            client.write(ADDR, 0);
                        }
    );

    // --- 任务 2：监控值变化，并打印信息 ---
    std::cout << "--- 启动值变化监控任务 ---" << std::endl;

    // 创建另一个 MonitorTask 实例来管理此任务
    MonitorTask valueChangeTask;

    client.startMonitor(valueChangeTask,
                        ADDR,
                        SAMPLING_INTERVAL,
                        // 条件函数：判断值是否发生变化
                        [](uint16_t prev, uint16_t current)
                        {
                            return prev != current;
                        },
                        // 回调函数：打印值信息
                        [](uint16_t prev, uint16_t current)
                        {
                            std::cout << "值发生变化！从 " << prev << " 变为 " << current << std::endl;
                        }
    );

    // 保持主线程运行，以确保监控线程不会提前退出
    std::cout << "主线程已启动监控，请修改寄存器值来测试。按任意键退出..." << std::endl;
    std::cin.get();
    // 在程序退出前，安全地停止所有监控任务
    client.stopMonitor(risingEdgeTask);
    // client.stopMonitor(valueChangeTask);

    return 0;
}


// #include <iostream>
// #include <utility> // for std::forward
//
// // 一个通用函数，接受左值和右值引用
// template <typename T>
// void show_value(T&& val) {
//     std::cout << "接收到一个值：" << val << std::endl;
// }
//
// // 一个包装器函数，它将收到的参数转发给 show_value
// template <typename T>
// void wrapper(T&& arg) {
//     std::cout << "在 wrapper 内部：" << std::endl;
//     // 使用 std::forward 完美转发
//     show_value(std::forward<T>(arg));
// }
//
// int main() {
//     int x = 10;
//
//     // 1. 传递一个左值 (x)
//     std::cout << "--- 传递左值 ---" << std::endl;
//     wrapper(x); // arg 被推导为 int&，std::forward 保持其左值属性
//
//     // 2. 传递一个右值 (20)
//     std::cout << "\n--- 传递右值 ---" << std::endl;
//     wrapper(20); // arg 被推导为 int&&，std::forward 保持其右值属性
//
//     return 0;
// }
